package displayboardinfo.services;

import java.util.Iterator;

import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.JAXBElement;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import displayboardinfo.entities.Admission;
import displayboardinfo.entities.Room;
import displayboardinfo.messages.ListAdmissionsRes;

/**
 * Klasa odpowiedzialna za wystawianie usług związanych z okresami przyjmowania w gabinetach.
 * 
 * @author Artur Jaworski
 */
@Path("/admissions")
public class AdmissionsServices {
	/**
	 * Usługa listowania okresów przyjęć konkretnego gabinetu.
	 * Usługa dostępna jest na serwerze pod adresem /admissions/list używając metody POST.
	 * 
	 * @param roomJaxb obiekt reprezentujący gabinet, którego okresy przyjęć mają zostać wylistowane, w formie koperty XML
	 * @return lista okresów przyjęć gabinetu
	 */
	@SuppressWarnings({ "rawtypes", "deprecation" })
	@Path("/list")
	@POST
	@Produces(MediaType.APPLICATION_XML)
	public ListAdmissionsRes list(JAXBElement<Room> roomJaxb) {
		SessionFactory sf = new Configuration().configure()
				.buildSessionFactory();
		Session session = sf.openSession();
		Room room = (Room) roomJaxb.getValue();
		ListAdmissionsRes response = new ListAdmissionsRes();

		Query query = session
				.createQuery(
						"from Admission a where a.room = :room").setParameter("room", room);

		for (Iterator it = query.iterate(); it.hasNext();) {
			Object item = it.next();

			Admission admission = (Admission) item;
			response.addAdmission(admission);
		}

		session.close();
		sf.close();
		return response;

	}
}
